import { defineStore } from 'pinia';
import { UserManager } from 'oidc-client-ts';
import { User } from 'oidc-client-ts';
import type { UserManagerSettings } from 'oidc-client-ts';
import { computed, ref } from 'vue';
// import { usePermissStore } from '@/stores/permiss'\
import { UserInfo } from '@/types/UserInfo';

const authorityUrl = import.meta.env.VITE_AUTH_SERVER_BASE_URL;
const selfUrl = import.meta.env.VITE_SELF_URL;
const redirectUri = `${selfUrl}/signin-oidc`;
const postLogoutRedirectUri = `${selfUrl}/login`;
const popupRedirectUri = `${selfUrl}/signout-callback-oidc`;
const popupPostLogoutRedirectUri = `${selfUrl}/login`;

export const useOidcStore = defineStore('oidc', () => {
  const userManagerSettings: UserManagerSettings = {
    authority: authorityUrl,
    client_id: 'FlyingEyeWebApp',
    client_secret: '1q2w3e*',
    // 登录重定向 URI
    redirect_uri: redirectUri,
    response_type: 'code',
    // 注销重定向 URI
    post_logout_redirect_uri: postLogoutRedirectUri,
    // 这两个参数与redirect_uri和post_logout_redirect_uri类似，但它们专门用于使用弹出窗口（popup）的认证和注销流程。
    // 当使用弹出窗口进行授权码流程时，这个参数指定了弹出窗口在成功授权后应被重定向到的URI。
    popup_redirect_uri: popupRedirectUri,
    // 当使用弹出窗口进行注销流程时，这个参数指定了弹出窗口在注销成功后应被重定向到的URI。
    popup_post_logout_redirect_uri: popupPostLogoutRedirectUri,
    scope:
      'DeviceServer DeviceOpsServer ClassifyMaterialServer OpenId2Ids email openid profile role phone address'
  };
  const userManager = new UserManager(userManagerSettings);

  // 当前登录的用户
  const currentUser = ref<User | null>(null);

  // 是否已经登录
  const isLogin = computed(() => {
    return currentUser.value != null;
  });

  function getBearerToken() {
    if (currentUser.value != null) {
      return currentUser.value.token_type + ' ' + currentUser.value.access_token;
    } else {
      return null;
    }
  }

  const cookie = ref<string | null>();

  // 登录重定向
  async function signinRedirectAsync() {
    await userManager.signinRedirect();
  }

  // 登录重定向回调
  async function signinRedirectCallbackAsync() {
    const user = await userManager.signinRedirectCallback();

    // 登录成功后，缓存用户信息，并设置 app 用户信息
    if (user != null) {
      cacheUserInfo(new UserInfo(user));
      setUserInfo(user);
    }
  }

  function cacheUserInfo(userInfo: UserInfo) {
    localStorage.setItem('userInfo', JSON.stringify(userInfo));
  }

  // 设置用户信息
  function setUserInfo(user: User) {
    cookie.value = document.cookie;
    currentUser.value = user;
    // const permiss = usePermissStore()
    // 设置用户权限
    // const keys = permiss.defaultList[user.profile.given_name == 'admin' ? 'admin' : 'user']
    // permiss.handleSet(keys)
  }

  // 注销登录
  function signout() {
    currentUser.value = null;
    cookie.value = '';
    // 注销登录，清除用户缓存
    localStorage.removeItem('userInfo');
  }

  // 重置用户状态
  function trySetUserInfoFromCache() {
    // 如果未登录，才会可能从缓存里加载用户信息
    if (!isLogin.value) {
      const userJson = localStorage.getItem('userInfo') || '';

      const userInfo = UserInfo.fromJson(userJson);

      if (userInfo != null) {
        const isValidUserInfo = UserInfo.isValid(userInfo);

        // 如果存在用户缓存，并且缓存有效，直接用缓存的用户信息设置 app 用户信息
        if (isValidUserInfo) {
          setUserInfo(userInfo.user);
        }
      }
    }
  }

  return {
    userManager,
    currentUser,
    getBearerToken,
    isLogin,
    signinRedirectAsync,
    signinRedirectCallbackAsync,
    signout,
    trySetUserInfoFromCache
  };
});
